"""
字段

https://docs.pydantic.dev/1.10/usage/schema/#field-customization

可选地，该 Field 函数可用于提供有关字段和验证的额外信息。它具有以下参数:

default: 默认值，省略号（...）表示该字段是必填的
default_factory: 设置动态默认值，不可与 default 同时使用
alias:字名
title: 字题
description: 字述
exclude.dict: 转换成 .dict, .json 时，排除该字段
include.dict: 转换成 .dict, .json 时，包含该字段
const: 如果存在，此参数必须与字段的默认值相同
gt: 对于数值类型（int, float, Decimal），大于 XXX
ge: 对于数值类型（int, float, Decimal），大于等于 XXX
lt: 对于数值类型（int, float, Decimal），小于 XXX
le: 对于数值类型（int, float, Decimal），小于等于 XXX
multiple_of: 对于数值类型，验证为 XXX 的倍数
max_digits: 对于 Decimal 的最大位数，不包括小数点前的零或尾随的小数零
decimal_places: 对于 Decimal 值，允许最多几个小数位，它不包括小数尾部的零
min_items: 列表的最小长度
max_items: 列表的最大长度
unique_items: 校验列表中的元素是否唯一（列表元素是否可以重复）
min_length: 字符串最小长度
max_length: 字符串最大长度
allow_mutation: 默认为 的布尔值 True。当为 False 时，TypeError如果该字段已在实例上分配，则该字段将引发 。模型配置必须设置 validate_assignment 为 True才能执行此检查
regex: 字符串的正则表达式
"""

from pydantic import Field
from pydantic.fields import (
    FieldInfo,
    NoArgAnyCallable,
    Undefined,
)

from my_typing import *

def NormalField(  # noqa: ignore func name
    default: Any = Undefined,
    *,
    default_factory: NoArgAnyCallable | None = None,
    title: StrOrNone = None,
    description: StrOrNone = None,
    **kwargs,
) -> FieldInfo:
    """
    普通字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述

    Returns:
        字符串字段
    """

    return Field(
        default,
        default_factory=default_factory,
        title=title,
        description=description or title,
        **kwargs,
    )

def CharField(  # noqa: ignore func name
    default: Any = Undefined,
    *,
    default_factory: NoArgAnyCallable | None = None,
    title: StrOrNone = None,
    description: StrOrNone = None,
    min_length: IntOrNone = None,
    max_length: IntOrNone = None,
    regex: StrOrNone = None,
    **kwargs,
) -> FieldInfo:
    """
    字符串字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述
        min_length: 最小长度
        max_length: 最大长度
        regex: 正则表达式

    Returns:
        字符串字段
    """

    return Field(
        default,
        default_factory=default_factory,
        title=title,
        description=description or title,
        min_length=min_length,
        max_length=max_length,
        regex=regex,
        **kwargs,
    )


def DecimalField(  # noqa: ignore func name
    default: Any = Undefined,
    *,
    default_factory: NoArgAnyCallable | None = None,
    title: StrOrNone = None,
    description: StrOrNone = None,
    min_value: FloatOrNone = None,
    max_value: FloatOrNone = None,
    max_digits: IntOrNone = None,
    decimal_places: IntOrNone = None,
    **kwargs,
) -> FieldInfo:
    """
    小数字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述
        min_value: 最小值
        max_value: 最大值
        max_digits: 数字的最大位数
        decimal_places: 小数点后的最大位数

    Returns:
        小数字段
    """

    return Field(
        default,
        default_factory=default_factory,
        title=title,
        description=description or title,
        ge=min_value,
        le=max_value,
        max_digits=max_digits,
        decimal_places=decimal_places,
        **kwargs,
    )


def IntegerField(  # noqa: ignore func name
    default: Any = Undefined,
    *,
    default_factory: NoArgAnyCallable | None = None,
    title: StrOrNone = None,
    description: StrOrNone = None,
    min_value: FloatOrNone = None,
    max_value: FloatOrNone = None,
    **kwargs,
) -> FieldInfo:
    """
    整数字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述
        min_value: 最小值
        max_value: 最大值

    Returns:
        整数字段
    """

    return Field(
        default,
        default_factory=default_factory,
        title=title or title,
        description=description,
        ge=min_value,
        le=max_value,
        **kwargs,
    )


def ListField(  # noqa: ignore func name
    default: Any = Undefined,
    *,
    default_factory: NoArgAnyCallable | None = None,
    title: StrOrNone = None,
    description: StrOrNone = None,
    min_length: IntOrNone = None,
    max_length: IntOrNone = None,
    unique: BoolOrNone = None,
    **kwargs,
) -> FieldInfo:
    """
    列表字段

    Args:
        default: 默认值，省略号（...）表示该字段是必填的
        default_factory: 设置动态默认值，不可与 default 同时使用
        title: 标题
        description: 描述
        min_length: 列表的最小长度
        max_length: 列表的最大长度
        unique: 校验列表中的元素是否唯一（列表元素是否可以重复）

    Returns:
        列表字段
    """

    return Field(
        default,
        default_factory=default_factory,
        title=title,
        description=description or title,
        min_items=min_length,
        max_items=max_length,
        unique_items=unique,
        **kwargs,
    )
